Il dataset si riferisce ai matrimoni celebrati a Milano per anno dell'evento, dal 2003 in poi.
In particolare questo dataframe è disponibile sul sito del comune di Milano, i dati raccolti al suo interno sono stati collezionati a partire dal primo gennaio del 2003 fino al 31 dicembre 2019 e sono stati aggiornati annualmente.
Cliccare qui andare al sito degli Open data del comune di Milano.
I matrimoni sono classificati secondo variabili relative all'evento (luogo del matrimonio, tipo di rito), e variabili relative ai due sposi (residenza, stato civile precedente il matrimonio, cittadinanza, età).
La variabile 'numerosità' si riferisce a quante coppie si sono sposate con le stesse caratteristiche, quindi è il numero di matrimoni che hanno le stesse identiche caratteristiche.
#importo le librerie
import numpy as np
import pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn; seaborn.set()
#importo il file csv
data =pd.read_csv(r"C:\Users\Laura\Desktop\PythonDataScienceHandbook-master\notebooks\data\matrimoni_unioni_civili.csv")
#cancello la colonna '_id' in quanto jupyter notebook al momento dell'importazione del file csv ne crea una identica
data.drop('_id', inplace=True, axis=1)
#visualizzo il dataframe
data
Creiamo due mask di valori booleani rispetto alle condizioni se il rito è cattolico o civile, dopo di chè andremo a confrontare con delle misure statistiche quali sono la media,il massimo e il minimo del'età con cui le persone si sono sposate, dopodichè andremo ad analizzare in particolare l'età media sia in generale che suddivisa per rito e anno
mask_cattolico= data['Rito'] == 'Cattolico'
mask_civile= data['Rito'] == 'Civile'
Andiamo a calcolare il numero di persone e lo inseriamo nella variabile 'persone', in quanto la variabile numero_matrimoni è espressa per numero di coppie ( quindi numero_matrimoni = 1 significa una coppia che si sposa e quindi due persone ).
Dopodichè inseriemo la variabile nel dataframe per semplificare i calcoli successivi
#rinomino la colonna Numerosità in numero_matrimoni per evitare di fare confusione
data =data.rename(columns={'Numerosità':'numero_matrimoni' })
persone=data['numero_matrimoni']*2
data['Numero_Persone']= persone
data.head()
Raggruppiamo il dataframe per anno e per rito andando a sommare il numero di persone raggruppate in quella specifica categoria.
data_grouped=data.groupby(['Anno_evento','Rito']).sum()
data_grouped.drop(['Eta_moglie', 'numero_matrimoni','Eta_marito'],inplace=True, axis=1)
data_grouped
Calcoliamo il massimo,il minimo e la media dell'età degli uomini e delle donne che si sono sposate negli anni presi in considerazione ovvero dal 2003 fino al 2019
#operazione per avere come media un risultato intero, senza decimali
media_etamoglie= int(round(data['Eta_moglie'].mean()))
media_etamarito= int(round(data['Eta_marito'].mean()))
print("\nL'età più alta in cui una donna che si è sposata fra il 2003 e il 2019 è pari a",np.max(data['Eta_moglie']),"anni" " \nmentre l'età più alta per gli uomini è pari ad anni",np.max(data['Eta_marito'],axis=0) )
print("\nL'età più bassa in cui una donna che si è sposata fra il 2003 e il 2019 è pari a",np.min(data['Eta_moglie']), " \nmentre l'età più bassa per gli uomini è pari a",np.min(data['Eta_marito'], axis=0) )
print("\nL'età media delle donne che si sono sposate fra il 2003 e il 2019 è pari ad anni",media_etamoglie," \nmentre l'età media degli uomini che si sono sposati fra il 2003 e il 2019 è pari ad anni",media_etamarito )
Analizziamo i valori n.a, ovvero i valori mancanti. Prima di tutti andiamo a vedere se sono presenti all'interno del dataframe generale
#analizziamo le righe
data.isnull().any() #ci sono valori nulli in Cittadinanza_marito,in Eta_marito e in Eta_moglie
#nella colonna cittadinanza marito l'unica riga con un valore mancante è la 42517esima
data[data['Cittadinanza_marito'].isnull()]
data[data['Eta_marito'].isnull()] #nella colonna eta_marito ci sono 12 righe con valori mancanti
#nella colonna eta_moglie ci sono 14 righe con valori mancanti
data[data['Eta_moglie'].isnull()]
Troviamo l'età media suddivisa per ogni rito senza distinzione di anno partendo da:
- la media dell'età degli uomini e delle donne che si sono sposate diversificata per riti senza distinzione di anno
- la media dell'età degli uomini e delle donne che si sono sposate diversificata per riti nei diversi anni
#media delle età delle persone che si sono sposate con i vari riti
eta_media=data.groupby('Rito').mean()
#trasformo in int per avere numeri interi
eta_media['Eta_marito']= eta_media['Eta_marito'].astype(int)
eta_media['Eta_moglie']= eta_media['Eta_moglie'].astype(int)
#calcolo la differenza di età fra marito e moglie
eta_media['Differenza_eta']= eta_media['Eta_marito']-eta_media['Eta_moglie']
eta_media.drop(['Anno_evento', 'numero_matrimoni','Numero_Persone'],inplace=True, axis=1)
eta_media
Da questa tabella deduciamo che mediamente le persone che si sposano prima sono coloro che professano la fede dei Testimonia di Geova. Osserviamo poi che mediamente la differenza di età maggiore è quella fra persone sposate con rito civile
Andiamo a guardare la medià di età fra i diversi anni perchè ci interessa vedere se c'è stato un effettivo cambiamento negli anni di questo dato
#media dell'età delle persone che si sono sposate nei diversi anni
eta_media_anni=data.groupby(['Anno_evento','Rito']).mean()
#trasformo in int per avere numeri interi
eta_media_anni['Eta_marito']= eta_media_anni['Eta_marito'].astype(int)
eta_media_anni['Eta_moglie']= eta_media_anni['Eta_moglie'].astype(int)
#calcolo la differenza di età fra marito e moglie
eta_media_anni['Differenza_eta']= abs(eta_media_anni['Eta_marito']-eta_media_anni['Eta_moglie'])
eta_media_anni.drop(['numero_matrimoni','Numero_Persone'],inplace=True, axis=1)
eta_media_anni
eta_media_anni = eta_media_anni.reset_index()
eta_melt= eta_media_anni.melt(id_vars=["Anno_evento","Rito","Differenza_eta"],
var_name='sesso',
value_name='Eta')
eta_melt.drop('Differenza_eta',inplace=True,axis=1)
eta_melt
g= seaborn.relplot(data= eta_melt, x='Anno_evento',y='Eta',hue='sesso',col='Rito',col_wrap=3)
Notiamo che mediamente l'età in cui una donna si sposa è più bassa rispetto all'uomo.
In particolare possiamo vedere come nel rito cattolico e in quello civile l'età delle persone per ogni anno è abbastanza stabile (anche se nel civile negli ultimi anni si è alzata).
np.max(eta_media_anni['Differenza_eta'])
eta_media_anni.query('Differenza_eta == 10')
La differenza di età maggiore è stata registrata nel 2012, fra due persone sposate con rito Israelita, ed è pari a 10 anni
Per poter riuscire a capire meglio l'andamento dei matrimoni nel corso degli anni abbiamo deciso di utilizzare dei grafici
Iniziamo a guardare l'andamento del numero delle persone che si sono sposate in generale negli anni
#raggruppo per anno e conto le persone sposate per ogni anno
data_grouped2=data.groupby(['Anno_evento']).sum()
data_grouped2.drop(['Eta_moglie', 'numero_matrimoni','Eta_marito'],inplace=True, axis=1)
data_grouped2
#creo il grafico
seaborn.lineplot(data=data_grouped2, x='Anno_evento', y='Numero_Persone');
Si può notare che con il passare degli anni matrimoni di qualunque tipo sono calati.
In particolare possiamo notare che a partire dal 2008 la 'curva' della quantità di persone che si sposano diminuisce
variazione_2008_2009= round(100-((5780/6722)*100),2)
variazione_2009_2010= round(((5818/5780)*100)-100,2)
print ("Notiamo come fra il 2008 e il 2009 il numero di persone sposate siano diminuite del "
,variazione_2008_2009, "% \nmentre fra il 2009 il 2010 il numero di persone sale del", variazione_2009_2010,"%")
A nostro parere la ragione per cui il numero di persone sposate diminuisca del 14% nel 2008 è stata la crisi economica. Infatti a causa della crisi econimica del 2008 ci furono delle difficoltà a trovare un’occupazione stabile, ad avere uno stipendio sufficiente e diventare autonomi dalle famiglie; questo portò i giovani a rimanere legati economicamente ai genitori e a sposarsi più avanti con l'età.
#dataframe per le persone sposate con rito cattolico e con rito civile
cattolici = data.loc[(data['Rito'] == 'Cattolico')].groupby(['Anno_evento']).sum()
cattolici.drop(['Eta_moglie', 'numero_matrimoni','Eta_marito'],inplace=True, axis=1)
civili= data.loc[(data['Rito'] == 'Civile')].groupby(['Anno_evento']).sum()
civili.drop(['Eta_moglie', 'numero_matrimoni','Eta_marito'],inplace=True, axis=1)
#creo il grafico per i cattolici
seaborn.lineplot(data=cattolici, x='Anno_evento', y='Numero_Persone');
Anche prendendo in considerazione solo i matrimoni cattolici possiamo notare come con il passare degli anni siano diminuiti
variazione_2003_2019= round(((4196/1270)*100)-100,2)
print("Dal 2003 al 2019 c'è stata una diminuzione del numero di persone che si sposate del",variazione_2003_2019, "%")
#creo il grafico per i civili
seaborn.lineplot(data=civili, x='Anno_evento', y='Numero_Persone',color='red');
Analizzando il numero di persone sposate con rito civile possiamo notare che nel 2008 c'è stata una diminuzione del numero di persone sposate civilmente ma lentamente a partire dal 2010 hanno iniziato ad aumentare. Guardiamo in particolare la diminuizione avvenuta fra il 2008 e il 2010:
Unendo i due grafici possiamo fare un'analisi più completa
#definisco il dataframe
df = data.loc[((data['Rito'] == 'Cattolico') | (data['Rito']=='Civile'))].groupby(['Anno_evento', 'Rito']).sum()
df.drop(['Eta_moglie', 'numero_matrimoni','Eta_marito'],inplace=True, axis=1)
#creo il grafico
seaborn.lineplot(data=df ,x='Anno_evento', y='Numero_Persone',hue="Rito");
Analizzando i matrimoni civili e cattolici simultaneamente notiamo che i matrimoni civili dall'inizio della raccolta dei dati ( ovvero dal 2003 ) sono in numero maggiore rispetto ai matrimoni effettuati con rito cattolico e non solo hanno avuto una diminuzione a partire dal 2008 minore rispetto ai matrimoni cattolici ma dal 2010, nonostante le persone che si sposano con rito cattolico continuano a diminuire , i matrimoni civili iniziano ad aumentare.
evangelico = data.loc[(data['Rito'] == 'Evangelico')].groupby(['Anno_evento']).sum()
evangelico.drop(['Eta_moglie', 'numero_matrimoni','Eta_marito'],inplace=True, axis=1)
evangelico
seaborn.lineplot(data=evangelico, x='Anno_evento', y='Numero_Persone', color='black');
Nel comune di Milano fra il 2003 e il 2019 il numero di persone, rispetto agli altri riti, che si sono sposate con il rito evangelico è basso, infatti i numeri spazione fra un minimo di 6 ad un massimo di 16 persone l'anno
Negli ultimi quattro anni osserviamo che il numero di persone che si sono sposate si è stabilizzato, ovvero dal 2016 fino al 2019 abbiamo un numero di persone sempre uguale di persone che si sono sposate co rito evangelico (in particolare sono sei persone ogni anno)
geova = data.loc[(data['Rito'] == 'Geova')].groupby(['Anno_evento']).sum()
geova.drop(['Eta_moglie', 'numero_matrimoni','Eta_marito'],inplace=True, axis=1)
seaborn.lineplot(data=geova, x='Anno_evento', y='Numero_Persone',color='green');
Anche per questo rito abbiamo una quantità di persone minore rispetto ai due riti principali (quello cattolico e quello civile)
Notiamo come il numero di persone sposate con il rito della fede dei Testimoni di Geova sono aumentati negli anni, in particolare dal 2009 sempre più persone si sono sposate con questo rito
israelita = data.loc[(data['Rito'] == 'Israelita')].groupby(['Anno_evento']).sum()
israelita.drop(['Eta_moglie', 'numero_matrimoni','Eta_marito'],inplace=True, axis=1)
seaborn.lineplot(data=israelita, x='Anno_evento', y='Numero_Persone',color='purple');
La quantità di persone che si sono sposate a Milano con il rito Isrealita è molto bassa, è il rito con la quantità minore di persone sposate, che variano fra le due persone l'anno e le sei persone l'anno.
altri = data.loc[(data['Rito'] == 'Altri Riti')].groupby(['Anno_evento']).sum()
altri.drop(['Eta_moglie', 'numero_matrimoni','Eta_marito'],inplace=True, axis=1)
seaborn.lineplot(data=altri, x='Anno_evento', y='Numero_Persone',color='orange');
Per tutti gli altri riti diversi da quelli presi in considerazione finora possiamo notare come il numero di persone sposate siano piccoli fino al 2008 (fra due persone l'anno e le otto persone l'anno); dal 2008 la quantità di persone inizia ad aumentare, anche se di poco, per poi stabilizzarsi per due anni (nel 2009 e nel 2010), dopodichè abbiamo che nel 2011 sono diminiuti di 4 unità per poi crescere ancora.
citt_marito= data.groupby(['Cittadinanza_marito']).sum()
citt_marito.drop(['Anno_evento', 'Eta_marito','Eta_moglie','numero_matrimoni'],inplace=True, axis=1)
citt_moglie= data.groupby(['Cittadinanza_moglie']).sum()
citt_moglie.drop(['Anno_evento', 'Eta_marito','Eta_moglie','numero_matrimoni'],inplace=True, axis=1)
Vogliamo sapere quante persone con cittadinanza non italiana si sono sposate a Milano
a = citt_marito.query("Cittadinanza_marito != 'Italia'")
b = citt_moglie.query("Cittadinanza_moglie != 'Italia'")
p1= a['Numero_Persone'].sum()
p2 = b['Numero_Persone'].sum()
print("Le persone con cittadinanza non Italiana sposate a Milano fra il 2003 e il 2019 sono pari a:", p1+p2)
Ora analizziamo quante persone si sono sposate con la stessa cittadinanza
citt_it=data.query("Cittadinanza_marito== 'Italia' & Cittadinanza_moglie== 'Italia' ").shape[0]*2
print("In particolare le persone che si sono sposate entrambe con cittadinza italiana sono:",citt_it)
persone_stessa_cit= data.query('Cittadinanza_marito== Cittadinanza_moglie').shape[0]*2
print("La quantità di persone che si sono sposate con persone con la stessa cittadinanza sono:",persone_stessa_cit)
citt_straniera=data.query("Cittadinanza_marito!= 'Italia' & Cittadinanza_moglie!= 'Italia' & Cittadinanza_marito==Cittadinanza_moglie ")
print("Le persone sposate con stessa cittadinanza, diversa da italiana, sono:",citt_straniera.shape[0]*2)
cs= citt_straniera.groupby(['Cittadinanza_marito','Cittadinanza_moglie']).sum()
cs.drop(['Anno_evento','Eta_marito','Eta_moglie','numero_matrimoni'],inplace=True,axis=1)
cs
In particolare vediamo nella tabella riportata sopra il numero di persone sposate con stessa cittadinanza suddivise per le varie nazionalità
Analizziamo ora le persone sposate fra di loro con nazionalità differenti
citt_diverse= data.query('Cittadinanza_marito!= Cittadinanza_moglie')
print("Il numero di persone sposate con nazionalità differenti sono",citt_diverse.shape[0]*2)
citt_diverse_it= data.query("Cittadinanza_marito!= Cittadinanza_moglie & (Cittadinanza_marito== 'Italia' | Cittadinanza_moglie == 'Italia')")
print("Le persone con nazionalità italiana che hanno sposato uno straniero sono:",citt_diverse_it.shape[0]*2)
import pandas as pd
import numpy as np
import folium
import os
import json
import requests
from folium.features import GeoJson, GeoJsonTooltip, GeoJsonPopup, LatLngPopup
sposi = data
sposi =sposi.rename(columns={'Numerosità':'numero_matrimoni' })
#Lo trasformo per avere due colonne: Coniuge, con valori "marito" e "moglie", e Cittadinanza con la nazionalità corrispondente
sposi_key=sposi.melt(
id_vars=[
'Anno_evento',
'Luogo_matrimonio',
'Rito',
'Residenza_marito',
'Residenza_moglie',
'Stato_civile_marito',
'Stato_civile_moglie',
'Eta_marito',
'Eta_moglie',
'numero_matrimoni'],
var_name="Coniuge",
value_name="Cittadinanza")
sposi_key.Coniuge=sposi_key.Coniuge.str.replace("Cittadinanza_","")
num=sposi_key.groupby("Cittadinanza")[['numero_matrimoni']].aggregate(sum)
num
num2=sposi_key.groupby("Cittadinanza")[['Eta_marito','Eta_moglie']].aggregate('mean')
num2
num=num.join(num2)
num
num=num.reset_index()
num
#world_countries è il file geojson con le colonne prese dal csv e i nomi delle nazioni allineati.
with open(r'C:\Users\Laura\Desktop\Choropleth-Matrimoni\countries_lp.geojson') as mm:
world_countries = json.load(mm)
sposi = pd.read_csv(r"C:\Users\Laura\Desktop\Choropleth-Matrimoni\sposi.csv", sep=",")
sposi
geoprova = folium.Map(location=[41.9027835, 12.4963655], tiles= "OpenStreetMap", zoom_start=2)
popup = GeoJsonPopup(
fields=["name_long", "NumerositÃ\xa0", "Eta_marito", "Eta_moglie"],
aliases=["Nome", "Numero di coniugi:", "Media età marito:", "Media età moglie:"],
localize=True,
labels=True,
)
tooltip = GeoJsonTooltip(
fields=["name_long", "NumerositÃ\xa0", "Eta_marito", "Eta_moglie"],
aliases=["Nome", "Numero di coniugi:", "Media età marito:", "Media età moglie:"],
localize=True,
sticky=False,
labels=True,
style="""
background-color: #F0EFEF;
border: 2px solid black;
border-radius: 3px;
box-shadow: 3px;
""",
max_width=800,
)
g=folium.Choropleth(
geo_data=world_countries,
name='choropleth',
data=sposi,
columns=['name_long', 'Numerosità'],
key_on='feature.properties.name_long',
fill_color='Spectral',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='Permessi di soggiorno'
).add_to(geoprova)
g.geojson.add_child(tooltip)
g.geojson.add_child(popup)
folium.TileLayer('stamentoner').add_to(geoprova)
geoprova